# -*- coding: utf-8 -*-
# @Time    : 2021/12/16 16:30 
# @Author  : BrandonGT
# @FileName: auto.py 
# -----------------------------------------------------
# Python 自带Module
import os
import cmd
import sys
import ctypes

# Python 第三方Module

# Python 自定义Module
from bin.core import XivCore
from bin.craft import XivCraft
from bin.core import ColorPrint as cprint

# -----------------------------------------------------


class XivAutoKey(cmd.Cmd):
    """啤啤版的FFXIV自动工具"""
    intro = """
    欢迎使用 XivAutoKey 最终幻想14 自动工具
    工具以学习为目的进行开发，功能违反最终幻想14用户协议
    使用风险和后果请自行承担_(:з」∠)_
    ==============================================\n
    使用 `helpme` 可获得关于工具使用的说明.\n
    使用 `help 命令` 可获得关于具体命令的说明.\n
    使用 `CTRL + C` 退出程序.
    """
    prompt = "(XivAutoKey)"

    def __init__(self):
        super(XivAutoKey, self).__init__()
        self.app = None
        self.hwnd = None
        self.craft = XivCraft()

    def emptyline(self):
        """当用户输入空行时，不返回"""
        pass

    def do_helpme(self, arg):
        """软件使用说明"""
        cprint.print("\nXivAutoKey工具包含以下命令\n", 'yellow')
        cprint.print("hook | craft | submit | screenshot\n", 'green')
        cprint.print("> 命令功能解释：", 'red')
        print("""
hook: 将FFXIV游戏进行挂钩（执行功能前，必须先运行这个命令）\n
craft: 执行生产配方，自动后台生产\n
submit: 自动提交理符工具（暂未添加）\n""")

    def do_hook(self, arg):
        """
挂钩FFXIV游戏进程

hook cn : 挂钩 FFXIV 国服

hook jp : 挂钩 FFXIV 国际服
"""
        # 根据输入的参数设置返回信息（国服\国际服）
        msg = "国服" if not arg or arg == 'cn' else "国际服"
        arg = 'cn' if not arg else arg
        cprint.print(f"\n> 正在查找 FFXIV {msg} 进程...", 'yellow')

        # 创建挂钩对象，获取FFXIV窗口句柄
        self.core = XivCore(arg)
        self.core.search_pid()
        self.app = self.core.hook_pid()
        self.hwnd = self.core.get_ffxiv_hwnd()

        # 返回信息
        if not self.app or not self.hwnd:
            cprint.print(f"\n> 未找到 FFXIV 进程/窗口句柄...\n", 'red')
        else:
            cprint.print(f"\n> FFXIV 进程已连接...可执行其他命令...\n", 'green')

    def do_craft(self, arg):
        """
自动生产配方工具

craft -search ： 搜索当前可用的生产配方

craft macros_name : 执行指定'macros_name'的生产配方
"""
        try:
            if arg:
                if arg == '-search':
                    result = self.craft.search_macros()
                    cprint.print(f"\n> 已找到的生产配方：{result}\n", 'yellow')
                else:
                    config = self.craft.parse_macros(arg)
                    if config:
                        self.craft.process_craft(self.core, config)
            else:
                cprint.print("\n请使用 `help craft`命令查看该命令的具体使用方法...\n", 'red')
        except:
            cprint.print("\n暂未与FFXIV游戏挂钩，请先运行hook功能...\n", 'red')

    def do_submit(self, arg):
        """自动提交理符工具"""
        cprint.print("\n这就是一个大饼！有生之年再添加吧！\n", 'yellow')

    def do_jump(self, arg):
        """自动跳跃防止强制掉线"""
        self.craft.auto_jump(self.core)

    def do_exit(self):
        """退出程序"""
        return True

    def is_admin(self):
        """判断运行环境是否为管理员权限"""
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            return False


if __name__ == '__main__':
    try:
        os.system('cls')
        client = XivAutoKey()
        if client.is_admin():
            client.cmdloop()
        else:
            ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
    except:
        exit()
